﻿package joystick 
{
	/**
	 * ジョイスティックのボタンの状態.
	 * <p>
	 * JoyClient の getDeviceList() を呼び出した時に通知されるイベントに
	 * このクラスのデータが入る。
	 * </p>
	 * @author Hikipuro
	 */
	public class JoystickState
	{
		/**
		 * JoyClient で扱えるボタンの数.
		 */
		public static const BUTTON_COUNT:uint = 10;
		
		/**
		 * ボタンが押されっぱなしになっている時の値.
		 */
		private static const BUTTON_HELD:uint = 0x01;
		
		/**
		 * ボタンが押された時の値.
		 */
		private static const BUTTON_DOWN:uint = 0x02;
		
		/**
		 * ボタンが離された時の値.
		 */
		private static const BUTTON_UP:uint = 0x04;
		
		/**
		 * デバイス番号.
		 */
		public var deviceNumber:uint;
		
		/**
		 * X 軸の値.
		 * <p>
		 * -100 から　100 までの値を取る。
		 * </p>
		 */
		public var x:int;
		
		/**
		 * Y 軸の値.
		 * <p>
		 * -100 から　100 までの値を取る。
		 * </p>
		 */
		public var y:int;
		
		/**
		 * ボタンの配列.
		 * 通常、この値を直接使わずに、 isDown(), isUp(), isHeld() を使用する。
		 */
		public var button:Array;
		
		/**
		 * ボタンの状態.
		 * フレームワークの内部で使用する。
		 */
		private var buttonState:Array;
		
		/**
		 * コンストラクタ.
		 */
		public function JoystickState() 
		{
			deviceNumber = 0;
			x = 0;
			y = 0;
			button = new Array();
			button.length = BUTTON_COUNT;
			buttonState = new Array();
			buttonState.length = BUTTON_COUNT;
		}
		
		/**
		 * フレームワーク内で使用する.
		 * <p>
		 * 前のフレームの JoystickState と比較して状態を更新する。
		 * </p>
		 * @param	state	前のフレームの JoystickState
		 */
		public function update(state:JoystickState):void 
		{
			for (var i:uint = 0; i < BUTTON_COUNT; i++) {
				if (state.button[i] == 0 && button[i] == 1) {
					buttonState[i] = BUTTON_DOWN;
					continue;
				}
				if (state.button[i] == 1 && button[i] == 0) {
					buttonState[i] = BUTTON_UP;
					continue;
				}
				if (state.button[i] == 1 && button[i] == 1) {
					buttonState[i] = BUTTON_HELD;
					continue;
				}
			}
		}
		
		/**
		 * ボタンが押された瞬間かチェックする.
		 * @param	buttonNumber	ボタン番号
		 * @return	ボタンが押された瞬間の時 true
		 */
		public function isDown(buttonNumber:uint):Boolean 
		{
			return buttonState[buttonNumber] == BUTTON_DOWN ? true: false;
		}
		
		/**
		 * ボタンが離された瞬間かチェックする.
		 * @param	buttonNumber	ボタン番号
		 * @return	ボタンが離された瞬間の時 true
		 */
		public function isUp(buttonNumber:uint):Boolean 
		{
			return buttonState[buttonNumber] == BUTTON_UP ? true: false;
		}
		
		/**
		 * ボタンが押されっぱなしになっているかチェックする.
		 * @param	buttonNumber	ボタン番号
		 * @return	ボタンが押されっぱなしになっている時 true
		 */
		public function isHeld(buttonNumber:uint):Boolean 
		{
			return buttonState[buttonNumber] == BUTTON_HELD ? true: false;
		}
		
		/**
		 * 方向キーの左が押されているかチェックする.
		 */
		public function get left():Boolean 
		{
			return x < -50;
		}
		
		/**
		 * 方向キーの右が押されているかチェックする.
		 */
		public function get right():Boolean 
		{
			return x > 50;
		}
		
		/**
		 * 方向キーの上が押されているかチェックする.
		 */
		public function get up():Boolean 
		{
			return y < -50;
		}
		
		/**
		 * 方向キーの下が押されているかチェックする.
		 */
		public function get down():Boolean 
		{
			return y > 50;
		}
	}

}